{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 逻辑回归\n",
    "- 线性决策边界的逻辑回归\n",
    "- 非线性决策边界的逻辑回归\n",
    "- 正则化后的逻辑回归算法"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-20T02:36:18.460842Z",
     "start_time": "2025-06-20T02:36:18.298712Z"
    }
   },
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "# 优化函数，用于最小化损失函数\n",
    "from scipy.optimize import minimize\n",
    "# 数据预处理，PolynomialFeatures用于构造特征\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "\n",
    "pd.set_option('display.notebook_repr_html', False)\n",
    "pd.set_option('display.max_columns', None)\n",
    "pd.set_option('display.max_rows', 150)\n",
    "pd.set_option('display.max_seq_items', None)\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "import seaborn as sns\n",
    "sns.set_context('notebook')\n",
    "sns.set_style('white')"
   ],
   "outputs": [],
   "execution_count": 1
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-20T02:36:19.622950Z",
     "start_time": "2025-06-20T02:36:19.601360Z"
    }
   },
   "source": [
    "# 数据读取函数\n",
    "def loadData(file, delimeter):\n",
    "    data = np.loadtxt(file, delimiter=delimeter)\n",
    "    print('Dimension=>', data.shape)\n",
    "    # 输出前五行\n",
    "    print(data[1:6, :])\n",
    "    return data"
   ],
   "outputs": [],
   "execution_count": 2
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-20T02:36:22.704208Z",
     "start_time": "2025-06-20T02:36:22.685121Z"
    }
   },
   "source": [
    "# 数据可视化函数\n",
    "def plotData(data, label_x, label_y, label_pos, label_neg, axes=None):\n",
    "    # 划分正负样本\n",
    "    pos = data[:, 2] == 1\n",
    "    neg = data[:, 2] == 0\n",
    "    \n",
    "    if axes == None:\n",
    "        axes = plt.gca()\n",
    "    # data[pos] 过滤出数据中的正样本，这种写法不太理解？？？\n",
    "    axes.scatter(data[pos][:,0], data[pos][:,1], marker='+', c='k', s=60, label=label_pos)\n",
    "    axes.scatter(data[neg][:,0], data[neg][:,1], c='y', s=60, label=label_neg)\n",
    "    axes.set_xlabel(label_x)\n",
    "    axes.set_ylabel(label_y)\n",
    "    axes.legend(frameon=True, fancybox=True)"
   ],
   "outputs": [],
   "execution_count": 3
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-20T02:36:25.181210Z",
     "start_time": "2025-06-20T02:36:25.161701Z"
    }
   },
   "source": [
    "data = loadData('data1.txt', ',')\n",
    "X = np.c_[np.ones((data.shape[0], 1)), data[:, 0:2]]\n",
    "Y = np.c_[data[:, 2]]"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dimension=> (100, 3)\n",
      "[[30.28671077 43.89499752  0.        ]\n",
      " [35.84740877 72.90219803  0.        ]\n",
      " [60.18259939 86.3085521   1.        ]\n",
      " [79.03273605 75.34437644  1.        ]\n",
      " [45.08327748 56.31637178  0.        ]]\n"
     ]
    }
   ],
   "execution_count": 5
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 线性决策边界\n",
    "> 通过两门考试的成绩判断这个人是否通过测试，是则为 1，否则为 0"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-20T02:36:28.295083Z",
     "start_time": "2025-06-20T02:36:28.151081Z"
    }
   },
   "source": [
    "plotData(data, 'Exam 1 score', 'Exam 2 score', 'Pass', 'Fail')"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 7
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 自定义逻辑回归算法\n",
    "#### $$ h_{\\theta}(x) = g(\\theta^{T}x)$$\n",
    "#### $$ g(z)=\\frac{1}{1+e^{−z}} $$"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-20T02:37:25.959222Z",
     "start_time": "2025-06-20T02:37:25.944193Z"
    }
   },
   "source": [
    "# 定义 sigmod 函数\n",
    "def sigmod(z):\n",
    "    return 1/(1 + np.exp(-z))"
   ],
   "outputs": [],
   "execution_count": 11
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 对数损失函数\n",
    "#### $$ J(\\theta) = \\frac{1}{m}\\sum_{i=1}^{m}\\big[-y^{(i)}\\, log\\,( h_\\theta\\,(x^{(i)}))-(1-y^{(i)})\\,log\\,(1-h_\\theta(x^{(i)}))\\big]$$\n",
    "## 向量化的损失函数(矩阵形式)\n",
    "#### $$ J(\\theta) = -\\frac{1}{m}\\big((\\,log\\,(g(X\\theta))^Ty+(\\,log\\,(1-g(X\\theta))^T(1-y)\\big)$$"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-20T02:37:32.533451Z",
     "start_time": "2025-06-20T02:37:32.513687Z"
    }
   },
   "source": [
    "# 定义损失函数\n",
    "def costFunc(theta, X, Y):\n",
    "    m = Y.size\n",
    "    h = sigmod(X.dot(theta))\n",
    "    \n",
    "    J = -(1.0/m)*(np.log(h).T.dot(Y) + np.log(1 - h).T.dot(1-Y))\n",
    "    \n",
    "    if np.isnan(J[0]):\n",
    "        return np.inf\n",
    "    return J[0]"
   ],
   "outputs": [],
   "execution_count": 12
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 求偏导(梯度)\n",
    "\n",
    "#### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m}\\sum_{i=1}^{m} ( h_\\theta (x^{(i)})-y^{(i)})x^{(i)}_{j} $$ \n",
    "## 向量化的偏导(梯度)\n",
    "#### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m} X^T(g(X\\theta)-y)$$"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-20T02:37:36.255124Z",
     "start_time": "2025-06-20T02:37:36.241911Z"
    }
   },
   "source": [
    "# 梯度下降算法\n",
    "def gradient(theta, X, Y):\n",
    "    m = Y.size\n",
    "    h = sigmod(X.dot(theta.reshape(-1, 1)))\n",
    "    \n",
    "    grad = (1.0/m)*X.T.dot(h-Y)\n",
    "    return grad.flatten()"
   ],
   "outputs": [],
   "execution_count": 13
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 初始位置的损失函数值大小（预测值和真实值差异大小）"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-20T02:37:38.707195Z",
     "start_time": "2025-06-20T02:37:38.683759Z"
    }
   },
   "source": [
    "initial_theta = np.zeros(X.shape[1])\n",
    "cost = costFunc(initial_theta, X, Y)\n",
    "grad = gradient(initial_theta, X, Y)\n",
    "print(\"损失函数初始值=>\", cost)\n",
    "print(\"下降梯度初始值=>\", grad)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "损失函数初始值=> 0.6931471805599453\n",
      "下降梯度初始值=> [ -0.1        -12.00921659 -11.26284221]\n"
     ]
    }
   ],
   "execution_count": 14
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 使用优化函数求解损失函数最小值"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-20T02:37:44.041907Z",
     "start_time": "2025-06-20T02:37:44.026954Z"
    }
   },
   "source": [
    "res = minimize(costFunc, initial_theta, args=(X, Y), jac=gradient, options={'maxiter': 400})\n",
    "res"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\WangBing\\AppData\\Local\\Temp\\ipykernel_23156\\3029285183.py:6: RuntimeWarning: divide by zero encountered in log\n",
      "  J = -(1.0/m)*(np.log(h).T.dot(Y) + np.log(1 - h).T.dot(1-Y))\n",
      "C:\\Users\\WangBing\\AppData\\Local\\Temp\\ipykernel_23156\\3029285183.py:6: RuntimeWarning: invalid value encountered in dot\n",
      "  J = -(1.0/m)*(np.log(h).T.dot(Y) + np.log(1 - h).T.dot(1-Y))\n",
      "C:\\Users\\WangBing\\AppData\\Local\\Temp\\ipykernel_23156\\3029285183.py:6: RuntimeWarning: divide by zero encountered in log\n",
      "  J = -(1.0/m)*(np.log(h).T.dot(Y) + np.log(1 - h).T.dot(1-Y))\n",
      "C:\\Users\\WangBing\\AppData\\Local\\Temp\\ipykernel_23156\\3029285183.py:6: RuntimeWarning: invalid value encountered in dot\n",
      "  J = -(1.0/m)*(np.log(h).T.dot(Y) + np.log(1 - h).T.dot(1-Y))\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "  message: Optimization terminated successfully.\n",
       "  success: True\n",
       "   status: 0\n",
       "      fun: 0.20349770158950983\n",
       "        x: [-2.516e+01  2.062e-01  2.015e-01]\n",
       "      nit: 25\n",
       "      jac: [-2.686e-09  4.364e-07 -1.397e-06]\n",
       " hess_inv: [[ 2.853e+03 -2.329e+01 -2.274e+01]\n",
       "            [-2.329e+01  2.045e-01  1.730e-01]\n",
       "            [-2.274e+01  1.730e-01  1.962e-01]]\n",
       "     nfev: 31\n",
       "     njev: 28"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-20T02:37:49.617011Z",
     "start_time": "2025-06-20T02:37:49.600061Z"
    }
   },
   "source": [
    "# 自定义预测函数，预测是否通过\n",
    "def predict(theta, X, threshold=0.5):\n",
    "    p = sigmod(X.dot(theta.T)) >= threshold\n",
    "    return p.astype('int')"
   ],
   "outputs": [],
   "execution_count": 17
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-20T02:37:50.892276Z",
     "start_time": "2025-06-20T02:37:50.882763Z"
    }
   },
   "source": [
    "p = sigmod(np.array([1, 45, 85]).dot(res.x.T))\n",
    "passOrNot = predict(res.x.T, np.array([1, 45, 85]))\n",
    "print(\"成绩一45分，成绩二85分通过测试的概率=>\", p)\n",
    "print(\"成绩一45分，成绩二85分是否通过测试=>\", passOrNot)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "成绩一45分，成绩二85分通过测试的概率=> 0.7762903249331023\n",
      "成绩一45分，成绩二85分是否通过测试=> 1\n"
     ]
    }
   ],
   "execution_count": 18
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 非线性决策边界"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
